// 布尔类型
let bool: boolean = false
let bool2: boolean
bool2 = true

// 数值类型
let num: number = 123
let num2: number
num2 = 0b1111011	//二进制
num2 = 0O173	//八进制
num = 0x7b	//十六进制

// 字符串类型
let str: string = 'abc'
let str2: string
str2 = `数值是<${str}>`	//模板字符串

// 数组类型
// 写法一
let arr: number[]
arr = [1, 2, 3, 4]
// 写法二
let arr2: Array<number>
arr2 = [5, 6, 7, 8]
// 联合类型
let arr3: (string | number)[]
arr3 = [1, 'str']

// 元组类型（元组类型必须按照声明的顺序和长度来赋值）
let tuple: [string, number, boolean]
tuple = ['a', 1, false]

// 枚举类型
enum Roles {
	user,		//0
	admin,	//1
	work		//2
}
enum Roles2 {
	user = 2,			//2
	admin,				//3
	work = 6			//6
}

// any类型
let value: any
value = 'abc'
value = false
value = 1234
let value2: any[] = ['abc', false, 123]

// void类型（没有返回值）
let consoleText = (text: string): void=>{
	console.log(text)
}
consoleText('abcd')

let v: void
v = undefined
v = null

// null 与 undefined（null 与 undefined 是其他类型的子类型，null 与 undefined可以赋给其他任意类型的值）
let n: null = null
let u: undefined = undefined

// never类型（不可能有返回值）
const errorFun = (msg: string): never => {
	throw new Error(msg)
}

// object类型
let obj = {
	name: 'juehm'
}

// 类型断言
const getLength = (target: string | number) :number => {
	if((<string>target).length || (target as string).length === 0){
		return (<string>target).length
	}else{
		return target.toString().length
	}
}
getLength(12345)
getLength("12345")
